package com.zgis.module.bas.util.encrypt;

import java.security.MessageDigest;
import java.util.HashMap;
import java.util.Map;
import java.util.UUID;

import cn.hutool.jwt.JWT;
import cn.hutool.jwt.JWTHeader;
import cn.hutool.jwt.JWTUtil;
import org.apache.commons.codec.binary.Base64;

/**
 * 修改记录:
 * 24-09-29     zhengchaojun             首次创建
 */

/**
 * 类描述：Encrypt类
 */
public class EncryptUtil
{
    public static void main(String[] args) throws Exception
    {

//        7fafd9f9-35e6-4612-925d-518eeb2e6535
        String token = UUID.randomUUID().toString();
        String srcStr = "12345678";
        String md5Str = getMd5(srcStr);

        Map<String, Object> map = new HashMap<String, Object>() {
            private static final long serialVersionUID = 1L;
            {
                put("uid", Integer.parseInt("123"));
//                put("expire_time", System.currentTimeMillis() + 1000 * 60 * 60 * 24 * 15);
                put("expire_time", System.currentTimeMillis() + 10);
            }
        };

        String    str =  JWTUtil.createToken(map, "1234".getBytes());
        final JWT jwt = JWTUtil.parseToken(str);
          boolean verify = JWTUtil.verify("eyJ0eXAiOiJKV1QiLCJhbGciOiJIUzI1NiJ9.eyJ1aWQiOjEyMywiZXhwaXJlX3RpbWUiOjE3MzEzNzU4MTM4OTJ9.AySoMQ_e8DH5l5a8UDIyKjQahFzGIiCywTd8VehItt0",  "1234".getBytes());


        System.out.println("getHeader Hash: " + str);
        System.out.println("getHeader Hash: " + verify);
        System.out.println("getHeader Hash: " + jwt.getHeader(JWTHeader.TYPE).toString());
        System.out.println("getPayload Hash: " + jwt.getPayload("sub"));
//        System.out.println("str Hash: " + str);
//        System.out.println("token Hash: " + token);
//        System.out.println("MD5 Hash: " + md5Str);
//        String pwd = "c29tZXVzZXIxMjM0NTY=";
//        String rawPwd = decodePwd(pwd);
//        System.out.println("Raw Password: " + rawPwd);
    }

    /**
     * 计算给定字符串的MD5哈希值，并将结果进行Base64编码。
     *
     * @param srcStr 要进行哈希计算的原始字符串。
     * @return 经过MD5哈希和Base64编码后的字符串。
     * @throws Exception 如果在哈希计算或编码过程中发生错误。
     */
    public static String getMd5(String srcStr) throws Exception
    {
        MessageDigest md5      = MessageDigest.getInstance("MD5");
        Base64        base64en = new Base64();
        byte[]        bytes    = srcStr.getBytes("UTF-8");
        byte[]        newBytes = md5.digest(bytes);
        return base64en.encodeToString(newBytes);
    }

    /**
     * 使用DES算法解密经过Base64编码的密码字符串。
     *
     * @param pwd 经过Base64编码的加密密码字符串。
     * @return 解密后的原始密码字符串。
     * @throws Exception 如果解密过程中发生错误。
     */
    public static String decodePwd(String pwd) throws Exception
    {
        byte[] key = new byte[]{122, 98, 67, 88, 95, 49, 64, 33};
        return (new DesUtil()).decode(pwd, key);
    }
}
